home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
msdos
/
attr102
/
attr.c
next >
Wrap
Text File
|
1991-10-18
|
5KB
|
163 lines
/*************************************************************************
ATTR.C Ver.1.02
ATTR [{+/-}{r/h/s/a}] [YY:MM:DD] [HH:MM:SS] <file name>
このプログラムを C言語の勉強に使用しないでください。
但し、悪い見本で使用する場合は、この限りではありません。
若し、使用した場合は、すぐに忘れることをお勧めします。(^^;)
*************************************************************************/
#include <dos.h>
#include <fcntl.h>
struct find_t
{
char reserved[21];
char attrib;
unsigned wr_time;
unsigned wr_date;
long size;
char name[13];
};*/
struct find_t f;
void set_attr(char*);
int val(char*);
void guide(char*);
/************************** main routine *********************************/
main(int argc,char *argv[])
{
char buf[50];
int i=0,j=0,k=0,err=0;
unsigned attrib,date,time;
if (argc==1)
{
guide(argv[0]);
return(0);
}
while (buf[k]=*(argv[argc-1]+k)) k++;
while (k>=0 && buf[--k]!=0x5c && buf[k]!=0x3a);
buf[++k]=0;
printf("---------------+-----------------------------------------------------------\n");
printf(" path | %s\n",argv[argc-1]);
printf("---------------+---------------------------+----------+----------+---------\n");
printf(" file name | attribute | date | time | size\n");
printf("---------------+---------------+-----------+----------+----------+---------\n");
while (1)
{
if (!j) i=_dos_findfirst(argv[argc-1],0x3f,&f);
if (j++) i=_dos_findnext(&f);
if (i) break;
for(i=0;buf[i+k]=*(f.name+i);i++);
buf[i+k]=0;
if (argc>2)
{
attrib=f.attrib;
date =f.wr_date;
time =f.wr_time;
for(err=0,i=2;i<argc;i++) set_attr(argv[i-1]);
if (attrib!=f.attrib) if (err =_dos_setfileattr(buf,f.attrib))
{
f.attrib=attrib;
}
if (date!=f.wr_date || time!=f.wr_time)
{
if (_dos_open(buf,O_WRONLY,&i))
{
f.wr_date=date;
f.wr_time=time;
err++;
}
else
err +=_dos_setftime(i,f.wr_date,f.wr_time);
_dos_close(i);
}
}
printf("%14s",f.name);
printf("%c",err?'*':' ');
printf("|%s", f.attrib & _A_RDONLY ? "R/O" : " " );
printf(" %s", f.attrib & _A_HIDDEN ? "Hid" : " " );
printf(" %s", f.attrib & _A_SYSTEM ? "Sys" : " " );
printf(" %s", f.attrib & _A_ARCH ? "Arc" : " " );
printf("|%s", f.attrib & _A_VOLID ? "Vol" : " " );
printf(" %s", f.attrib & _A_SUBDIR ? "Dir " :" Fil" );
printf("| %02d-%02d-%02d ",((f.wr_date>>9 & 127)+80)%100
, f.wr_date>> 5 & 15
, f.wr_date & 31);
printf("| %02d:%02d:%02d ", f.wr_time>>11 & 31
, f.wr_time>> 5 & 63
,(f.wr_time & 31)* 2 );
(f.attrib & 0x18) ? printf("|********\n") : printf("|%8ld\n",f.size);
}
printf("---------------+---------------+-----------+----------+----------+---------\n");
printf(" %3d file(s).\n",j-1);
return (j-1);
}
/******************* sub routine *******************/
void set_attr(char set[])
{
int i;
if (set[0]=='+' || set[0]=='-') for (i=1;set[i]!=0;i++)
{
if (set[i] < 97) set[i] += 32;
if (set[0]=='-') f.attrib = ~f.attrib;
if (set[i]=='s') f.attrib |= _A_SYSTEM;
if (set[i]=='r') f.attrib |= _A_RDONLY;
if (set[i]=='h') f.attrib |= _A_HIDDEN;
if (set[i]=='a') f.attrib |= _A_ARCH;
if (set[0]=='-') f.attrib = ~f.attrib;
}
if (set[2]=='-' && set[5]=='-')
f.wr_date=(((val(&set[0])+20)%100)<<9)+(val(&set[3])<<5)+val(&set[6]);
if (set[2]==':' && set[5]==':')
f.wr_time=(val(&set[0])<<11)+(val(&set[3])<<5)+val(&set[6])/2;
}
int val(char *a)
{
int b=0;
while (*a>='0' && *a<='9') b=b*10+(int)(*a++)-48;
return (b);
}
void guide(char *name)
{
printf("+----------------------------------------------------------------------------+\n");
printf("| ATTRIBUTE EXCHANGER ver 1.02 |\n");
printf("+----------------------------------------------------------------------------+\n");
printf("| |\n");
printf("| path : %-66s|\n",name);
printf("| option: [{+|-}{r|h|s|a}・・・] [YY-MM-DD] [HH:MM:SS] <ファイル名> |\n");
printf("| |\n");
printf("| ファイル名(含ディレクトリ)で指定されたファイルの |\n");
printf("| 属性、日付、時刻を変更、また、表示 を行います。 |\n");
printf("+----------------------------------------------------------------------------+\n");
printf(" | + 以降に指定したファイルの属性を設定します。 |\n");
printf(" | - 以降に指定したファイルの属性を削除します。 |\n");
printf(" | |\n");
printf(" | r 読出のみ可能 [ R/O ] Read only |\n");
printf(" | h 隠しファイル [ Hid ] Hidden |\n");
printf(" | s システムファイル [ Sys ] System |\n");
printf(" | a 書き込みされたファイル [ Arc ] Archives |\n");
printf(" | ボリューム・ラベル [ Vol ] Volume |\n");
printf(" | サブ・ディレクトリ [ Dir ] Directly |\n");
printf(" | ファイル [ Fil ] File |\n");
printf(" +-------------------------------------------------+\n");
}